/*
 * Copyright (c) 2010, Thiago Campos Viana.
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in
 *       the documentation and/or other materials provided with the
 *       distribution.
 *     * Neither the name of Thiago Campos Viana nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
using System.Collections;
using System;
using System.Text;
using System.IO;


public class Utils {

	public static readonly byte[] shortToByteArray(short value) {
        return new byte[]{
                    (byte) (value >> 8),
                    (byte) value};
    }

    public static readonly short byteArrayToShort(byte[] b) {
        return (short)(((b[0] & 0xFF) << 8)
                + (b[1] & 0xFF));
    }

    public static readonly byte[] intToByteArray(int value) {
        return new byte[]{
                    (byte) (value >> 24),
                    (byte) (value >> 16),
                    (byte) (value >> 8),
                    (byte) value};
    }

    public static readonly int byteArrayToInt(byte[] b) {
        return (b[0] << 24)
                + ((b[1] & 0xFF) << 16)
                + ((b[2] & 0xFF) << 8)
                + (b[3] & 0xFF);
    }

    public static readonly byte[] longToByteArray(long value) {
        return new byte[]{
                    (byte) (value >> 56),
                    (byte) (value >> 48),
                    (byte) (value >> 40),
                    (byte) (value >> 32),
                    (byte) (value >> 24),
                    (byte) (value >> 16),
                    (byte) (value >> 8),
                    (byte) value};
    }

    public static readonly long byteArrayToLong(byte[] b) {
        return (long) ((b[0] << 56)
                + ((b[1] & 0xFF) << 48)
                + ((b[2] & 0xFF) << 40)
                + ((b[3] & 0xFF) << 32)
                + ((b[4] & 0xFF) << 24)
                + ((b[5] & 0xFF) << 16)
                + ((b[6] & 0xFF) << 8)
                + (b[7] & 0xFF));
    }
	
	public static readonly byte[] StrToByteArray (string str) {
        //System.Text.UnicodeEncoding  encoding=new System.Text.UnicodeEncoding();
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding ();
        return encoding.GetBytes (str);
    }
	
	public static readonly string ByteArrayToStr (byte[] str) {
        //System.Text.UnicodeEncoding  encoding=new System.Text.UnicodeEncoding();
        //return encoding.GetString (str);
        System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
        return encoding.GetString (str);
    }
	
	public static readonly decimal ByteArrayToDecimal (byte[] src)
    {
        using (MemoryStream stream = new MemoryStream (src)) {
            using (BinaryReader reader = new BinaryReader (stream)) {
                return reader.ReadDecimal ();
            }
        }
    }

}
